package cdu.sl.controller;

import cdu.sl.common.domain.Result;
import cdu.sl.domain.dto.*;
import cdu.sl.domain.vo.ClassGroupVO;
import cdu.sl.service.ClassGroupService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 班级控制器
 */
@Api(tags = "班级接口")
@Slf4j
@RestController
@RequestMapping("/class-groups")
@RequiredArgsConstructor
public class ClassGroupController {

    private final ClassGroupService classGroupService;

    /**
     * 创建班级
     *
     * @param classGroupCreateDTO 班级创建DTO
     * @return 创建后的班级信息
     */
    @ApiOperation("创建班级")
    @PostMapping
    public Result<ClassGroupVO> createClassGroup(@RequestBody @Validated ClassGroupCreateDTO classGroupCreateDTO) {
        log.info("创建班级：{}", classGroupCreateDTO);
        ClassGroupVO classGroupVO = classGroupService.createClassGroup(classGroupCreateDTO);
        return Result.success("创建班级成功", classGroupVO);
    }

    /**
     * 获取班级详情
     *
     * @param id 班级ID
     * @return 班级详情
     */
    @ApiOperation("获取班级详情")
    @GetMapping("/{id}")
    public Result<ClassGroupVO> getClassGroupById(@PathVariable Long id) {
        log.info("获取班级详情：{}", id);
        ClassGroupVO classGroupVO = classGroupService.getClassGroupById(id);
        return Result.success(classGroupVO);
    }


    /**
     * 获取当前用户创建的所有班级
     *
     * @return 班级列表
     */
    @ApiOperation("获取当前用户创建的所有班级")
    @GetMapping("/created")
    public Result<List<ClassGroupVO>> getCurrentUserCreatedClassGroups() {
        log.info("获取当前用户创建的所有班级");
        List<ClassGroupVO> classGroupVOs = classGroupService.getCurrentUserCreatedClassGroups();
        return Result.success(classGroupVOs);
    }

    /**
     * 获取当前用户加入的所有班级
     *
     * @return 班级列表
     */
    @ApiOperation("获取当前用户加入的所有班级")
    @GetMapping("/joined")
    public Result<List<ClassGroupVO>> getCurrentUserJoinedClassGroups() {
        log.info("获取当前用户加入的所有班级");
        List<ClassGroupVO> classGroupVOs = classGroupService.getCurrentUserJoinedClassGroups();
        return Result.success(classGroupVOs);
    }


    /**
     * 修改班级信息
     *
     * @param classGroupUpdateDTO 修改班级信息数据传输对象
     * @return 无
     */
    @PutMapping
    @ApiOperation("修改班级信息")
    public Result<Void> updateClass(@RequestBody @Validated ClassGroupUpdateDTO classGroupUpdateDTO) {
        log.info("修改班级信息：{}", classGroupUpdateDTO);
        classGroupService.updateClass(classGroupUpdateDTO);
        return Result.success();
    }


    /**
     * 用户通过加入码进入班级
     *
     * @param userJoinClassDTO 用户加入班级数据传输对象
     * @return 无
     */
    @ApiOperation("学生加入班级")
    @PostMapping("/joinClass")
    public Result<Void> joinClass(@RequestBody UserJoinClassDTO userJoinClassDTO) {
        log.info("加入班级 , 加入码：{}", userJoinClassDTO);
        classGroupService.joinClass(userJoinClassDTO);
        return Result.success();
    }

    /**
     * 根据id删除班级
     *
     * @param id
     * @return
     */
    @ApiOperation("根据id删除班级")
    @DeleteMapping("/{id}")
    public Result<Void> deleteClass(@PathVariable Long id) {
        log.info("根据id删除班级 :{}", id);
        classGroupService.deleteClass(id);
        return Result.success();
    }

    /**
     * 审核学生入班申请 从班级中移除学生
     *
     * @param checkClassMembersDTO 审核学生入班申请数据传输对象
     * @return
     */
    @PutMapping("/member-status")
    @ApiOperation("审核学生是否可以加入")
    public Result<Void> checkMembersStatus(@RequestBody @Validated CheckClassMembersDTO checkClassMembersDTO) {
        log.info("审核学生加入资格：{}", checkClassMembersDTO);
        classGroupService.checkMembersStatus(checkClassMembersDTO);
        return Result.success();
    }


    /**
     * 根据加入码查询班级信息
     * @return
     */
    @GetMapping("/joinCode")
    @ApiOperation("根据加入码查询班级")
    public Result<ClassGroupVO> getClassGroupByJoinCode(@RequestParam String joinCode) {
        log.info("根据加入码查询班级：{}", joinCode);
        ClassGroupVO classGroupVO=classGroupService.getClassGroupByJoinCode(joinCode);
        return Result.success(classGroupVO);
    }



}